const events = require("events");
const emitter = new events();


(`
【事件监听器的默认限制】
            默认情况下，每个事件最多可以注册10个监听器
            超过10个监听器会发出警告，但不会阻止添加
            可以通过setMaxListeners方法修改这个限制
            这个限制是为了帮助发现内存泄漏
`);





(`
【事件参数传递】
            在触发事件时，可以向监听器传递任意数量的参数
            这些参数会被传递给监听器函数
`)
emitter.on('eventWithMultipleParams', (param1, param2, param3) => {
    console.log('接收到的参数:', param1, param2, param3);
});
emitter.emit('eventWithMultipleParams', '参数1', '参数2', '参数3');





(`
【错误事件处理】
            在EventEmitter中，'error'事件是一个特殊的事件
            如果没有为'error'事件注册监听器，当错误事件被触发时，Node.js会终止程序并输出错误信息
            因此，始终应该为EventEmitter实例添加'error'事件监听器
`)
emitter.on('error', (err) => {
    console.error('捕获到错误:', err.message);
});
emitter.emit('error', new Error('测试错误事件'));

/**
 * 九、继承EventEmitter
 * 在实际开发中，我们通常会创建自定义类并继承EventEmitter，以便在类中使用事件功能
 * 这是Node.js中许多内置模块（如Stream、Net等）的实现方式
 */
class MyEmitter extends events.EventEmitter {
    constructor() {
        super();
    }
    
    doSomething() {
        // 执行某些操作后触发事件
        this.emit('done', '操作完成');
    }
}

const myEmitter = new MyEmitter();
myEmitter.on('done', (message) => {
    console.log('收到完成事件:', message);
});
myEmitter.doSomething();





// 创建一个完整的事件处理示例
const EventEmitter = require('events');
const myEventEmitter = new EventEmitter();

// 设置最大监听器数量
myEventEmitter.setMaxListeners(15);

// 定义事件处理函数
const handleData = (data) => {
    console.log('接收到数据:', data);
};

const handleError = (error) => {
    console.error('发生错误:', error);
};

// 注册事件监听器
myEventEmitter.on('data', handleData);
myEventEmitter.on('error', handleError);
myEventEmitter.once('init', () => {
    console.log('初始化完成，此消息只显示一次');
});

// 触发事件
myEventEmitter.emit('init');
myEventEmitter.emit('data', { name: 'Node.js', version: '18.x' });
myEventEmitter.emit('data', { name: 'JavaScript', type: 'language' });

// 查看事件信息
console.log('已注册的事件:', myEventEmitter.eventNames());
console.log('data事件的监听器数量:', myEventEmitter.listenerCount('data'));

// 移除监听器
myEventEmitter.off('data', handleData);
console.log('移除监听器后，data事件的监听器数量:', myEventEmitter.listenerCount('data'));

// 移除所有监听器
myEventEmitter.removeAllListeners();
console.log('移除所有监听器后，已注册的事件:', myEventEmitter.eventNames());

/**
 * 总结
 * 
 * events模块是Node.js的核心模块之一，提供了事件驱动的基础功能
 * 通过EventEmitter类，我们可以实现发布/订阅模式，处理异步操作
 * 掌握events模块的使用对于理解Node.js的异步编程模型和构建事件驱动的应用程序至关重要
 */